[2025-07-07] SSTI, XXE, XML
🦥 본문
SSTI
- Server Side Template Injection. Template을 악용하여 Server Side에서 악의적인 해석을 유도
Template
-
동적 웹 페이지에 사용되는 변수 영역 혹은 틀
-
{{}}, {%%}, ${}을 따르며 이는 템플릿 엔진에 따라 상이
동작 흐름
- 템플릿 엔진이 사용자 입력을 템플릿 문법으로 처리하도록 코드 구성
- 악성 사용자가 {%code%}, 을 입력
- 서버가 code 또는 expression을 ‘실행’하여서 결과를 HTML로 랜더링
-
공격자는 code, expression을 통해 Server Side에서 서버 명령을 수행할 수 있을 뿐 아니라 결과를 받아 Interact도 가능
→ 주로 템플릿 엔진 및 SSTI 공격 확인 차 {{77}} 혹은 {%77%} 등의 payload를 사용. 만약 49가 결과값으로 나온다면, 해당 값을 Syntax로 인식하고 있다는 것.
- 예시 코드
→ 호스트에서 ls를 입력하는 코드. 템플릿 문법을 확인하는 게 좋음.
XXE
- XML eXternal Entity. External Entity를 Server Side에서 출력해 포함시키도락 함
XML
- eXtensible Markup Language. 데이터를 구조화하고 전송하기 위해 만들어진 언어
- HTML과 유사하게 생겼지만 데이터 표현 목적에 더 적합하며 태그를 자유롭게 만들 수 있음
-
기본 구조
- L1 : version은 1이고 내부 값은 UTF-8 인코딩 해석
- L2 : User라는 객체 안에 name, email이라는 객체가 있고 User.name = 홍길동, User.email = hong….
-
추가 기능 : DTD(Doc. Type Definition)
- note라는 데이터 타입 안에는 to, from, body가 들어가야 함을 의미
- to, from, body에 대한 데이터 타입을 PCDATA(Parshed Char Data(사람이 읽을 수 있는 말. 즉 String 값))이라고 정의
-
추가 기능 : External Entity
- 외부의 파일을 가져올 수 있는 기능
- data라는 DTD에는 secret이라는 값은 “file:….”을 넣은 변수라는 것을 의미
- 호출 시에는 앞에는 & 뒤에는 ;을 넣어서 호출
원리
-
예시
- xxe_payload 부분을 사용자 입력값으로 한다면 취약점 발생. 즉, 사용자가 입력한 값이
<?xml version="1.0"?> <!DOCTYPE data [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data>
이어서 원치 않는 파일을 파싱하여 출력하게 됨
- XML을 처리하는 서비스, Jenkins, SSO Service 취약
- XML Format의 GPX, KML, OSM(지형, 위치 정보를 다루는 파일 형식) 취약
방어
parser.setFeature(feature_external_ges, False)
- DTD를 막고 내부적으로 선언한 DTD로만 파일 형식 정의
- 외부 파일을 호출할 수 있는 DTD 비활성화
추가 자료
https://www.igloo.co.kr/security-information/웹-템플릿-엔진-기반의-ssti-취약점-분석/
Leave a comment